package com.longway.core.toolbox.wdp.msg;

import com.jfinal.aop.Before;
import com.jfinal.aop.Clear;
import com.jfinal.core.Controller;
import com.jfinal.core.NotAction;
import com.jfinal.kit.StrKit;
import com.jfinal.log.Log;
import com.longway.common.interceptor.LoginSessionInterceptor;
import com.longway.common.interceptor.AdminAuthInterceptor;
import com.longway.core.toolbox.wdp.WdpConfigKit;
import com.longway.core.toolbox.wdp.msg.bean.WdpAuth;
import com.longway.core.toolbox.wdp.msg.bean.WdpAuthTiket;

/**
 * 第三方平台消息控制器
 */
public abstract class WdpAuthEventController extends Controller {
    // 将 xml 和 in msg 存储到 request 中，解决控制器 单例的问题
    protected static final Log log = Log.getLog(WdpAuthEventController.class);
    // 本次请求 xml数据
    private String wdpAuthXml = null;
    // 本次请求 xml 解析后的 wxaMsg 对象
    private WdpAuth wdpAuth = null;

    @Override
    protected void _clear_() {
        super._clear_();
        this.wdpAuthXml = null;
        this.wdpAuth = null;
    }

    @Before(WdpAuthEventInterceptor.class)
    @Clear({LoginSessionInterceptor.class,AdminAuthInterceptor.class})
    public void index() {
        // 开发模式输出微信服务发送过来的  xml、json 消息
        if (WdpConfigKit.isDevMode()) {
            System.out.println("接收消息:");
            System.out.println(getWdpAuthXml());
        }
        WdpAuth wdpAuth = getWdpAuth();

        if (wdpAuth instanceof WdpAuthTiket) {
        	processAuthTiket((WdpAuthTiket) wdpAuth);
        }else {
            log.error("未能识别的小程序授权消息类型。 消息内容为：\n" + getWdpAuthXml());
        }
        // 直接回复success（推荐方式）
        renderText("success");
    }

    @NotAction
    public String getWdpAuthXml() {
        if (wdpAuthXml == null) {
        	wdpAuthXml = getRawData();
        	wdpAuthXml = MsgEncryptKit.decrypt(wdpAuthXml);
        }
        if (StrKit.isBlank(wdpAuthXml)) {
            throw new RuntimeException("请不要在浏览器中请求该连接");
        }
        return wdpAuthXml;
    }

    @NotAction
    public WdpAuth getWdpAuth() {
        if (wdpAuth == null) {
            IAuthParser authParser = WdpConfigKit.getAuthParser();
            wdpAuth = authParser.parser(getWdpAuthXml());
        }
        return wdpAuth;
    }
    
    /**
     * 解密
     */
    @NotAction
    public String getDecryptContent(Controller c, String token){
		String postdata = c.getRawData();
		return MsgEncryptKit.decrypt(postdata);
    }

    /**
     * 处理验证票据
     * @param textMsg 处理接收到的验证票据
     */
    protected abstract void processAuthTiket(WdpAuthTiket authTiket);


}
